package acwing_03;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;

public class _845_BFS_八数码 {
	static String start = "";
	static String end = "12345678x";
	static int[] dx = {-1,0,1,0};
	static int[] dy = {0,1,0,-1};
	
	// s的 i j 下标字符互换
	public static String swap(String s,int i,int j) {
		StringBuilder str = new StringBuilder(s);
		String temp = String.valueOf(str.charAt(i));
		str.replace(i, i+1, String.valueOf(str.charAt(j)));
		str.replace(j, j+1, temp);
		return str.toString();
	}
	
	public static int bfs() {
		Queue<String> q = new LinkedList(); 
		Map<String,Integer> record = new HashMap<>();
		// 起始位置入队
		q.add(start);
		// 表示与起始位置的距离是0
		record.put(start, 0);
		
		while(!q.isEmpty()) {
			// 移除头元素并返回
			String head = q.poll();
			// 获取该元素距离初始位置的距离
			int distance = record.get(head);
			// 如果该元素与最终位置的字符串相同，则返回距离
			if(head.equals(end)) return distance;
						
			// 到这里说明该元素不是最终结果，则进行处理
			// 拿到该元素中x的位置，将x的位置转为二维数组形式的位置
			// 本题目固定是 3*3，则 k / 3 能得到行，k % 3 能得到列
			int k = head.indexOf('x');
			int x = k / 3;
			int y = k % 3;
			// 对x进行上下左右移动
			for(int i = 0; i < 4; i++) {
				int removeX = x + dx[i];
				int removeY = y + dy[i];
				
				if(removeX >= 0 && removeX < 3 && removeY >= 0 && removeY < 3) {
					// 将二维下标转换成字符串下标
					int swapIndex = removeX * 3 + removeY;

					// 下标互换
					head = swap(head,k,swapIndex);
					
					// 为空说明没有进入过相同路径，则将本路径存入map且放入队列
					if(record.get(head) == null) {
						record.put(head, distance + 1);
						q.add(head);
					}
					
					// 下标重新互换，恢复原样
					head = swap(head,k,swapIndex);
				}
			}
		}

		return -1;
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		char c[] = scan.nextLine().toCharArray();
		scan.close();
		for(int i = 0; i < c.length; i++) {
			if(c[i] == ' ') {
				continue;
			}
			start += c[i];
		}
		System.out.println(bfs());
	}
}
